Skip to content

feat: stop polling when bridge history item is stale or has an invalid src hash#8479

Open
micaelae wants to merge 25 commits intomainfrom
swaps4380-invalid-src-hash
Open

feat: stop polling when bridge history item is stale or has an invalid src hash#8479
micaelae wants to merge 25 commits intomainfrom
swaps4380-invalid-src-hash

Conversation

@micaelae
Copy link
Copy Markdown
Member

@micaelae micaelae commented Apr 16, 2026

Explanation

Problem

Bridge txHistory persists invalid or premature src tx hashes (specially STX), and pending items could be polled indefinitely, spamming providers and leaving bad state after restarts.

Solution

  • Subscribe to TransactionController:transactionStatusUpdated instead of transactionFailed / transactionConfirmed, and update history item matching the tx id, action id, hash, batch, or approval

  • Skips persisting STX src hashes on submit. Set the hash when the tx is confirmed, or backfill from TransactionController as needed

  • If a transaction is deemed "too old", fetch the status once, then check if the tx has been mined on chain. If The src hash is nonexistent, stop polling and delete the history item to prevent re-polling on the next restart

References

Fixes https://consensyssoftware.atlassian.net/browse/SWAPS-4380

Checklist

  • I've updated the test suite for new or updated code as appropriate
  • I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
  • I've communicated my changes to consumers by updating changelogs for packages I've changed
  • I've introduced breaking changes in this PR and have prepared draft pull requests for clients and consumer packages to resolve them

Note

Medium Risk
Changes bridge tx polling and transaction event handling, including deleting history entries deemed stale/invalid; mistakes could stop status updates prematurely or remove valid history items.

Overview
Stops indefinite bridge-status polling by introducing an age-based cutoff (maxPendingHistoryItemAgeMs from remote feature flags, default 2 days) and deleting txHistory entries that appear to have an invalid/unmined srcTxHash, emitting a new polling_status reason invalid_transaction_hash.

Migrates BridgeStatusController from transactionFailed/transactionConfirmed subscriptions to TransactionController:transactionStatusUpdated, with broader history matching (id/actionId/batchId/hash/approvalTxId), avoids persisting Smart Transaction hashes until finalized, and refactors metrics to reuse a shared getPollingStatusUpdatedProperties payload (including improved error_message formatting).

Reviewed by Cursor Bugbot for commit 92fa59a. Bugbot is set up for automated code reviews on this repo. Configure here.

@micaelae micaelae force-pushed the swaps4380-invalid-src-hash branch 4 times, most recently from cecef86 to b0227e9 Compare April 20, 2026 21:44
@micaelae micaelae force-pushed the swaps4380-invalid-src-hash branch from b0227e9 to 449f0ed Compare April 20, 2026 22:02
@micaelae micaelae force-pushed the swaps4380-invalid-src-hash branch from 449f0ed to 28dd789 Compare April 20, 2026 22:15
@micaelae
Copy link
Copy Markdown
Member Author

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.1.0-preview-8e9c439
@metamask-previews/accounts-controller@37.2.0-preview-8e9c439
@metamask-previews/address-book-controller@7.1.1-preview-8e9c439
@metamask-previews/ai-controllers@0.6.3-preview-8e9c439
@metamask-previews/analytics-controller@1.0.1-preview-8e9c439
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-8e9c439
@metamask-previews/announcement-controller@8.1.0-preview-8e9c439
@metamask-previews/app-metadata-controller@2.0.1-preview-8e9c439
@metamask-previews/approval-controller@9.0.1-preview-8e9c439
@metamask-previews/assets-controller@6.0.0-preview-8e9c439
@metamask-previews/assets-controllers@104.1.0-preview-8e9c439
@metamask-previews/authenticated-user-storage@0.0.0-preview-8e9c439
@metamask-previews/base-controller@9.1.0-preview-8e9c439
@metamask-previews/base-data-service@0.1.1-preview-8e9c439
@metamask-previews/bridge-controller@70.1.1-preview-8e9c439
@metamask-previews/bridge-status-controller@70.0.5-preview-8e9c439
@metamask-previews/build-utils@3.0.4-preview-8e9c439
@metamask-previews/chain-agnostic-permission@1.5.0-preview-8e9c439
@metamask-previews/chomp-api-service@1.0.0-preview-8e9c439
@metamask-previews/claims-controller@0.5.0-preview-8e9c439
@metamask-previews/client-controller@1.0.1-preview-8e9c439
@metamask-previews/compliance-controller@2.0.0-preview-8e9c439
@metamask-previews/composable-controller@12.0.1-preview-8e9c439
@metamask-previews/config-registry-controller@0.2.0-preview-8e9c439
@metamask-previews/connectivity-controller@0.2.0-preview-8e9c439
@metamask-previews/controller-utils@11.20.0-preview-8e9c439
@metamask-previews/core-backend@6.2.1-preview-8e9c439
@metamask-previews/delegation-controller@3.0.0-preview-8e9c439
@metamask-previews/earn-controller@12.0.0-preview-8e9c439
@metamask-previews/eip-5792-middleware@3.0.3-preview-8e9c439
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-8e9c439
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-8e9c439
@metamask-previews/ens-controller@19.1.1-preview-8e9c439
@metamask-previews/eth-block-tracker@15.0.1-preview-8e9c439
@metamask-previews/eth-json-rpc-middleware@23.1.1-preview-8e9c439
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-8e9c439
@metamask-previews/foundryup@1.0.1-preview-8e9c439
@metamask-previews/gas-fee-controller@26.1.1-preview-8e9c439
@metamask-previews/gator-permissions-controller@4.0.0-preview-8e9c439
@metamask-previews/geolocation-controller@0.1.2-preview-8e9c439
@metamask-previews/json-rpc-engine@10.2.4-preview-8e9c439
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-8e9c439
@metamask-previews/keyring-controller@25.2.0-preview-8e9c439
@metamask-previews/logging-controller@8.0.1-preview-8e9c439
@metamask-previews/message-manager@14.1.1-preview-8e9c439
@metamask-previews/messenger@1.1.1-preview-8e9c439
@metamask-previews/messenger-cli@0.2.0-preview-8e9c439
@metamask-previews/money-account-balance-service@0.2.0-preview-8e9c439
@metamask-previews/money-account-controller@0.1.0-preview-8e9c439
@metamask-previews/money-account-upgrade-controller@0.0.0-preview-8e9c439
@metamask-previews/multichain-account-service@8.0.1-preview-8e9c439
@metamask-previews/multichain-api-middleware@2.0.0-preview-8e9c439
@metamask-previews/multichain-network-controller@3.0.6-preview-8e9c439
@metamask-previews/multichain-transactions-controller@7.0.4-preview-8e9c439
@metamask-previews/name-controller@9.1.1-preview-8e9c439
@metamask-previews/network-controller@30.0.1-preview-8e9c439
@metamask-previews/network-enablement-controller@5.0.2-preview-8e9c439
@metamask-previews/notification-services-controller@23.1.0-preview-8e9c439
@metamask-previews/permission-controller@12.3.0-preview-8e9c439
@metamask-previews/permission-log-controller@5.1.0-preview-8e9c439
@metamask-previews/perps-controller@3.2.0-preview-8e9c439
@metamask-previews/phishing-controller@17.1.1-preview-8e9c439
@metamask-previews/polling-controller@16.0.4-preview-8e9c439
@metamask-previews/preferences-controller@23.1.0-preview-8e9c439
@metamask-previews/profile-metrics-controller@3.1.3-preview-8e9c439
@metamask-previews/profile-sync-controller@28.0.2-preview-8e9c439
@metamask-previews/ramps-controller@13.2.0-preview-8e9c439
@metamask-previews/rate-limit-controller@7.0.1-preview-8e9c439
@metamask-previews/react-data-query@0.2.0-preview-8e9c439
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-8e9c439
@metamask-previews/sample-controllers@4.0.4-preview-8e9c439
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-8e9c439
@metamask-previews/selected-network-controller@26.1.0-preview-8e9c439
@metamask-previews/shield-controller@5.1.1-preview-8e9c439
@metamask-previews/signature-controller@39.2.0-preview-8e9c439
@metamask-previews/social-controllers@2.0.0-preview-8e9c439
@metamask-previews/storage-service@1.0.1-preview-8e9c439
@metamask-previews/subscription-controller@6.1.2-preview-8e9c439
@metamask-previews/transaction-controller@64.3.0-preview-8e9c439
@metamask-previews/transaction-pay-controller@19.2.1-preview-8e9c439
@metamask-previews/user-operation-controller@41.2.0-preview-8e9c439

@micaelae micaelae marked this pull request as ready for review April 21, 2026 17:07
@micaelae micaelae requested review from a team as code owners April 21, 2026 17:07
Comment thread packages/bridge-status-controller/src/bridge-status-controller.ts
Comment thread packages/bridge-status-controller/src/bridge-status-controller.ts Outdated
Comment thread packages/bridge-status-controller/src/bridge-status-controller.ts Outdated
Comment thread packages/bridge-status-controller/src/utils/bridge-status.ts
Comment thread packages/bridge-status-controller/src/bridge-status-controller.ts Outdated
@micaelae micaelae force-pushed the swaps4380-invalid-src-hash branch from 5b420db to 86fb638 Compare April 21, 2026 22:41
Comment thread packages/bridge-status-controller/src/bridge-status-controller.ts
Comment thread packages/bridge-status-controller/src/utils/bridge-status.ts
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 0af4d26. Configure here.

Comment thread packages/bridge-status-controller/src/utils/bridge-status.ts
Comment thread packages/bridge-status-controller/src/bridge-status-controller.ts
@micaelae micaelae enabled auto-merge April 21, 2026 23:24
@micaelae
Copy link
Copy Markdown
Member Author

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.1.0-preview-92fa59a42
@metamask-previews/accounts-controller@37.2.0-preview-92fa59a42
@metamask-previews/address-book-controller@7.1.1-preview-92fa59a42
@metamask-previews/ai-controllers@0.6.3-preview-92fa59a42
@metamask-previews/analytics-controller@1.0.1-preview-92fa59a42
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-92fa59a42
@metamask-previews/announcement-controller@8.1.0-preview-92fa59a42
@metamask-previews/app-metadata-controller@2.0.1-preview-92fa59a42
@metamask-previews/approval-controller@9.0.1-preview-92fa59a42
@metamask-previews/assets-controller@6.0.0-preview-92fa59a42
@metamask-previews/assets-controllers@104.1.0-preview-92fa59a42
@metamask-previews/authenticated-user-storage@1.0.0-preview-92fa59a42
@metamask-previews/base-controller@9.1.0-preview-92fa59a42
@metamask-previews/base-data-service@0.1.1-preview-92fa59a42
@metamask-previews/bridge-controller@70.1.1-preview-92fa59a42
@metamask-previews/bridge-status-controller@70.0.5-preview-92fa59a42
@metamask-previews/build-utils@3.0.4-preview-92fa59a42
@metamask-previews/chain-agnostic-permission@1.5.0-preview-92fa59a42
@metamask-previews/chomp-api-service@1.0.0-preview-92fa59a42
@metamask-previews/claims-controller@0.5.0-preview-92fa59a42
@metamask-previews/client-controller@1.0.1-preview-92fa59a42
@metamask-previews/compliance-controller@2.0.0-preview-92fa59a42
@metamask-previews/composable-controller@12.0.1-preview-92fa59a42
@metamask-previews/config-registry-controller@0.2.0-preview-92fa59a42
@metamask-previews/connectivity-controller@0.2.0-preview-92fa59a42
@metamask-previews/controller-utils@11.20.0-preview-92fa59a42
@metamask-previews/core-backend@6.2.1-preview-92fa59a42
@metamask-previews/delegation-controller@3.0.0-preview-92fa59a42
@metamask-previews/earn-controller@12.0.0-preview-92fa59a42
@metamask-previews/eip-5792-middleware@3.0.3-preview-92fa59a42
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-92fa59a42
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-92fa59a42
@metamask-previews/ens-controller@19.1.1-preview-92fa59a42
@metamask-previews/eth-block-tracker@15.0.1-preview-92fa59a42
@metamask-previews/eth-json-rpc-middleware@23.1.1-preview-92fa59a42
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-92fa59a42
@metamask-previews/foundryup@1.0.1-preview-92fa59a42
@metamask-previews/gas-fee-controller@26.1.1-preview-92fa59a42
@metamask-previews/gator-permissions-controller@4.0.0-preview-92fa59a42
@metamask-previews/geolocation-controller@0.1.2-preview-92fa59a42
@metamask-previews/json-rpc-engine@10.2.4-preview-92fa59a42
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-92fa59a42
@metamask-previews/keyring-controller@25.2.0-preview-92fa59a42
@metamask-previews/logging-controller@8.0.1-preview-92fa59a42
@metamask-previews/message-manager@14.1.1-preview-92fa59a42
@metamask-previews/messenger@1.1.1-preview-92fa59a42
@metamask-previews/messenger-cli@0.2.0-preview-92fa59a42
@metamask-previews/money-account-balance-service@0.2.0-preview-92fa59a42
@metamask-previews/money-account-controller@0.1.0-preview-92fa59a42
@metamask-previews/money-account-upgrade-controller@1.0.0-preview-92fa59a42
@metamask-previews/multichain-account-service@8.0.1-preview-92fa59a42
@metamask-previews/multichain-api-middleware@2.0.0-preview-92fa59a42
@metamask-previews/multichain-network-controller@3.0.6-preview-92fa59a42
@metamask-previews/multichain-transactions-controller@7.0.4-preview-92fa59a42
@metamask-previews/name-controller@9.1.1-preview-92fa59a42
@metamask-previews/network-controller@30.0.1-preview-92fa59a42
@metamask-previews/network-enablement-controller@5.0.2-preview-92fa59a42
@metamask-previews/notification-services-controller@23.1.0-preview-92fa59a42
@metamask-previews/permission-controller@12.3.0-preview-92fa59a42
@metamask-previews/permission-log-controller@5.1.0-preview-92fa59a42
@metamask-previews/perps-controller@3.2.0-preview-92fa59a42
@metamask-previews/phishing-controller@17.1.1-preview-92fa59a42
@metamask-previews/polling-controller@16.0.4-preview-92fa59a42
@metamask-previews/preferences-controller@23.1.0-preview-92fa59a42
@metamask-previews/profile-metrics-controller@3.1.3-preview-92fa59a42
@metamask-previews/profile-sync-controller@28.0.2-preview-92fa59a42
@metamask-previews/ramps-controller@13.2.0-preview-92fa59a42
@metamask-previews/rate-limit-controller@7.0.1-preview-92fa59a42
@metamask-previews/react-data-query@0.2.0-preview-92fa59a42
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-92fa59a42
@metamask-previews/sample-controllers@4.0.4-preview-92fa59a42
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-92fa59a42
@metamask-previews/selected-network-controller@26.1.0-preview-92fa59a42
@metamask-previews/shield-controller@5.1.1-preview-92fa59a42
@metamask-previews/signature-controller@39.2.0-preview-92fa59a42
@metamask-previews/social-controllers@2.0.0-preview-92fa59a42
@metamask-previews/storage-service@1.0.1-preview-92fa59a42
@metamask-previews/subscription-controller@6.1.2-preview-92fa59a42
@metamask-previews/transaction-controller@64.3.0-preview-92fa59a42
@metamask-previews/transaction-pay-controller@19.2.1-preview-92fa59a42
@metamask-previews/user-operation-controller@41.2.0-preview-92fa59a42

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant